<?php

/**
  ----------------------------------------------------------
 * @4A平台管理系统
  ----------------------------------------------------------
 * @copyright Copyright @ 2012 By www.4a.cc
  ----------------------------------------------------------
 * @author Yang Changwu<flash165@qq.com> 2012-04-14
  ----------------------------------------------------------
 * @version 0.1
  ----------------------------------------------------------
 */
class alipay {

    /**
      +----------------------------------------------------------
     * 支付宝充值处理
      +----------------------------------------------------------
     * @access public
     * @name BeginPay
     * @category   alipay
     * @subpackage  Pay
     * @param Array
     * @return array
     * @author Yang Changwu<flash165@qq.com> 2012-05-10
      +----------------------------------------------------------
     */
    public function BeginPay($arr = array(),$bankname='') {
        //var_dump($arr);exit;
        require_once("alipay/alipay_config.php");
        require_once("alipay/alipay_service.php");

        /*         * ************************请求参数************************* */
        //必填参数//
        //请与贵网站订单系统中的唯一订单号匹配
        $out_trade_no = $arr['order_num'];
        //订单名称，显示在支付宝收银台里的“商品名称”里，显示在支付宝的交易管理的“商品名称”的列表里。不能有空格
        $subject = $arr['discript'];
        //订单描述、订单详细、订单备注，显示在支付宝收银台里的“商品描述”里
        $body = $arr['discript'];
        //订单总金额，显示在支付宝收银台里的“应付总额”里
        $total_fee = $arr['fee_cny'];
        //扩展功能参数——默认支付方式//
        //默认支付方式，四个值可选：bankPay(网银); cartoon(卡通); directPay(余额); CASH(网点支付)
        $paymethod = 'directPay';
        //默认网银代号，代号列表见 http://club.alipay.com/read.php?tid=8681379
        $defaultbank = '';
        //扩展功能参数——防钓鱼//
        //防钓鱼时间戳
        $anti_phishing_key = '';
        //获取客户端的IP地址，建议：编写获取客户端IP地址的程序
        $exter_invoke_ip = '';
        //注意：
        //1.请慎重选择是否开启防钓鱼功能
        //2.exter_invoke_ip、anti_phishing_key一旦被使用过，那么它们就会成为必填参数
        //3.开启防钓鱼功能后，服务器、本机电脑必须支持SSL，请配置好该环境。
        //示例：
        //$exter_invoke_ip = '202.1.1.1';
        //$ali_service_timestamp = new AlipayService($aliapy_config);
        //$anti_phishing_key = $ali_service_timestamp->query_timestamp();//获取防钓鱼时间戳函数
        //
        //扩展功能参数——其他//
        //商品展示地址，要用 http://格式的完整路径，不允许加?id=123这类自定义参数
        $show_url = "";

        //自定义参数，可存放任何内容（除=、&等特殊字符外），不会显示在页面上
        $extra_common_param = "";

        //扩展功能参数——分润(若要使用，请按照注释要求的格式赋值)
        $royalty_type = "";       //提成类型，该值为固定值：10，不需要修改
        $royalty_parameters = "";
        //注意：
        //提成信息集，与需要结合商户网站自身情况动态获取每笔交易的各分润收款账号、各分润金额、各分润说明。最多只能设置10条
        //各分润金额的总和须小于等于total_fee
        //提成信息集格式为：收款方Email_1^金额1^备注1|收款方Email_2^金额2^备注2
        //示例：
        //royalty_type 		= "10"
        //royalty_parameters= "111@126.com^0.01^分润备注一|222@126.com^0.01^分润备注二"

        /*         * ********************************************************* */
        //构造要请求的参数数组
        $parameter = array(
            //接口名称，不需要修改
            "service" => "create_direct_pay_by_user",
            //交易类型，不需要修改
            "payment_type" => "1",
            //获取配置文件(alipay_config.php)中的值
            "partner" => trim($aliapy_config['partner']),
            "_input_charset" => trim(strtolower($aliapy_config['input_charset'])),
            "seller_email" => trim($aliapy_config['seller_email']),
            "return_url" => trim($aliapy_config['return_url']),
            "notify_url" => trim($aliapy_config['notify_url']),
            //从订单数据中动态获取到的必填参数
            "out_trade_no" => $out_trade_no,
            "subject" => $subject,
            "body" => $body,
            "total_fee" => $total_fee,
            //扩展功能参数——网银提前
            "paymethod" => $paymethod,
            "defaultbank" => $defaultbank,
            //扩展功能参数——防钓鱼
            "anti_phishing_key" => $anti_phishing_key,
            "exter_invoke_ip" => $exter_invoke_ip,
            //扩展功能参数——自定义参数
            "show_url" => $show_url,
            "extra_common_param" => $extra_common_param,
            //扩展功能参数——分润
            "royalty_type" => $royalty_type,
            "royalty_parameters" => $royalty_parameters
        );

        //构造即时到帐接口
        $alipayService = new AlipayService($aliapy_config);
        $html_text = $alipayService->create_direct_pay_by_user($parameter);
        return $html_text;
    }

    /**
      +----------------------------------------------------------
     * 支付宝充值回调处理
      +----------------------------------------------------------
     * @access public
     * @name CallbackPay
     * @category   alipay
     * @subpackage  Pay
     * @param Array
     * @return array
     * @author Yang Changwu<flash165@qq.com> 2012-05-10
      +----------------------------------------------------------
     */
    public function CallbackPay($arr = array(), $payorder = array(), \Home\Model\PayModel $paymodel) {
        require_once("alipay/alipay_config.php");
        require_once("alipay/alipay_notify.php");
//        echo "<pre>";
//        print_r($arr);
//        echo "</pre>";
//        echo "<pre>";
//        print_r($payorder);
//        echo "</pre>";
//        exit;
        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($aliapy_config);
        $verify_result = $alipayNotify->verifyReturn($arr);
        //验证成功
        if ($verify_result) {
            //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表                                   
            //判断金额
            if ($arr['total_fee'] != $payorder['pay_cny']) {
                return array(
                    'ret' => 1,
                    'msg' => '充值金额与订单金额不符！',
                );
            }
            //判断支付宝邮箱
            if ($arr['seller_email'] != $aliapy_config['seller_email']) {
                return array(
                    'ret' => 2,
                    'msg' => '商户邮箱不正确！',
                );
            }
            if ($payorder['flag'] == '1') {
                //成功跳转显示
                $api_url = U('pay/payok', array('sn' => $payorder['paysn']));
                header("Location:" . $api_url);
                die;
            }
            //判断该笔订单是否在商户网站中已经做过处理（可参考“集成教程”中“3.4返回数据处理”）
            //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
            //如果有做过处理，不执行商户的业务程序
            if ($arr['trade_status'] == 'TRADE_FINISHED' || $arr['trade_status'] == 'TRADE_SUCCESS') {
                if ($paymodel->setByOrderInfo($arr['out_trade_no'], $arr['trade_no'], strtotime($arr['notify_time']), 1)) {
                    return array(
                        'ret' => 0,
                        'msg' => '正确',
                    );
                }
                return array(
                    'ret' => 3,
                    'msg' => '充值失败，请联系客服处理！',
                );
            } else {
                return array(
                    'ret' => 3,
                    'msg' => '充值失败，请联系客服处理！',
                );
            }
            //验证失败
        } else {
            return array(
                'ret' => 4,
                'msg' => '交易信息被篡改，请联系客服处理！',
            );
            //如要调试，请看alipay_notify.php页面的return_verify函数，比对sign和mysign的值是否相等，或者检查$veryfy_result有没有返回true            
        }
    }

    /**
      +----------------------------------------------------------
     * 支付宝充值服务器回调处理
      +----------------------------------------------------------
     * @access public
     * @name Notify_Url
     * @category   alipay
     * @subpackage  Pay
     * @param Array
     * @return String
     * @author Yang Changwu<flash165@qq.com> 2012-05-10
      +----------------------------------------------------------
     */
    public function Notify_Url($arr = array(), $payorder = array(), \Home\Model\PayModel $paymodel) {
        require_once("alipay/alipay_config.php");
        require_once("alipay/alipay_notify.php");

        //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表            
        //判断金额
        if ($arr['total_fee'] != $payorder['pay_cny']) {
            //die(ShowMsg('充值金额与订单金额不符！','/pay/index.shtml','0','3000'));
            die('fail');
        }
        //判断支付宝邮箱
        if ($arr['seller_email'] != $aliapy_config['seller_email']) {
            //die(ShowMsg('商户邮箱不正确！','/pay/index.shtml','0','3000'));
            die('fail');
        }
        if ($payorder['flag'] == '1') {
            die('success');
        }

        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($aliapy_config);
        $verify_result = $alipayNotify->verifyReturn($arr);
        //验证成功
        if ($verify_result) {
            //判断该笔订单是否在商户网站中已经做过处理（可参考“集成教程”中“3.4返回数据处理”）
            //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
            //如果有做过处理，不执行商户的业务程序
            if ($arr['trade_status'] == 'TRADE_FINISHED' || $arr['trade_status'] == 'TRADE_SUCCESS') {
                if ($paymodel->setByOrderInfo($arr['out_trade_no'], $arr['trade_no'], $arr['notify_time'], 1)) {
                    //加入游戏接口
                    $gameModel = M('game_list');
                    $gameTag = $gameModel->field('enname')->where("id='" . $payorder['gid'] . "'")->find();
                    $class = $gameTag['enname'];
                    require_cache(APP_PATH . 'Home/Gameapi/' . $class . '.php');
                    $result = $class::pay_to_game($payorder);
                    if ($result) {
                        if ($paymodel->setByOrderInfo(0, 0, 0, 1, 1)) {
                            echo "success";
                            exit;
                        } else {
                            echo "fail";
                            exit;
                        }
                    } else {
                        echo "fail";
                        exit;
                    }
                }
                die('fail');
            } else {
                die('fail');
            }
            //验证失败
        } else {
            //如要调试，请看alipay_notify.php页面的return_verify函数，比对sign和mysign的值是否相等，或者检查$veryfy_result有没有返回true
            die('fail');
        }
    }

}

?>